/*
 * Copyright (C) 2005-2007 Oleh Hapon ohapon@users.sourceforge.net
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA.
 * 
 * Oleh Hapon
 * Kyiv, UKRAINE
 * ohapon@users.sourceforge.net
 */

/*
 * Created on 27.10.2003
 *
 */
package com.deruan.hotcore.base.common.bean;

import java.io.Serializable;


/**
 * @author Oleh Hapon
 * $Id$
 */
public class DefaultEntityBean<PK extends Serializable> implements Cloneable, EntityBean<PK> {

    private int state = Statable.NORMAL;
    
    private PK id;

    private boolean ditry;

    /**
     * Is intance in NORMAL state?
     */
    public boolean isNormal() {
        return state == NORMAL;
    }

    /**
     * Is intance in MODIFIED state?
     */
    public boolean isModified() {
        return state == MODIFIED;
    }

    /**
     * Is intance in DELETED state?
     */
    public boolean isDeleted() {
        return state == DELETED;
    }

    /**
     * Is intance in CREATED state?
     */
    public boolean isCreated() {
        return state == CREATED;
    }




    /**
     * Turn the details' state to NORMAL.
     */
    public void setNormal() {
        ditry = false;
        state = NORMAL;
    }

    /**
     * Turn the details' state to MODIFIED.
     */
    public void setModified() {
        if (isNormal()) {
            state = MODIFIED;
        }
    }

    /**
     * Turn the details' state to DELETED.
     */
    public void setDeleted() {
        // DELETE operation has HIGH priority
        // so always marks as deleted
        if (isCreated()) {
            ditry = true;
        }
        state = DELETED;
    }

    /**
     * Turn the details' state to CREATED.
     */
    public void setCreated() {
        if (isNormal()) {
            state = CREATED;
        }
    }

    public PK getId() {
        return id;
    }

    public void setId(PK id) {
        this.id = id;
    }
    

    public boolean isDitry() {
        return ditry;
    }

    public Object clone() {
        Object o = null;
        try {
            o = super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return o;
    }
    
    public boolean equals(Object o) {
        
        if (o == null) {
            return false;
        }
        
        if (this == o) {
            return true;
        }
       
        if (o instanceof DefaultEntityBean) {
            Object key1 = getId();
            Object key2 = ((DefaultEntityBean) o).getId();
            if (key1 == null || key2 == null) {
                return false;
            }
            if (key1 == key2) {
                return true;
            }
            return equalsId(key1, key2);
        }
      
        return false;
    }
    
    protected boolean equalsId(Object id1, Object id2) {
	return id1.equals(id2);
    }
    
    /**
     * Initialize
     */
    public void init() {
	// STUB
    }

    /**
     * Destroy
     */
    public void destroy() {
	// STUB
    }

}
